// 类型是一个变量，定义时不能确定类型。在调用时确定类型
function echo<T>(arg: T): T {
    return arg
}

const result = echo(123)


function swap<T, U>(tuple: [T, U]): [U, T] {
    return [tuple[1] , tuple[0]]
}
const result2 = swap(['string', 123])

// 约束泛型
// function echoWithArr<T>(arg: T[]): T[]{
//     console.log(arg.length)
//     return arg
// }
// 限制传入的值一定是有length属性的
interface IWithLength {
    length: number
}
function echoWithLength<T extends IWithLength>(arg: T): T {
    console.log(arg.length)
    return arg
}


// 类使用泛型
class Queue<T> {
    private data: T[] = [];
    push(item: T) {
        return this.data.push(item)
    }
    pop() {
        return this.data.shift()
    }
}
const queue = new Queue<number>()
queue.push(1)
console.log(queue.pop()?.toFixed())


// 接口使用类型
interface KeyPair<T, U> {
    key: T,
    value: U
}
let kp1: KeyPair<number, string> = {
    key: 1,
    value: 'string'
}
let arrTwo: Array<number> = [1, 2, 3]